/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufpr.tads.Rent.model;

import br.ufpr.tads.Rent.controller.Automovel;
import br.ufpr.tads.Rent.controller.EnumClass.*;
import br.ufpr.tads.Rent.controller.EnumClass.categoria;
import br.ufpr.tads.Rent.controller.EnumClass.estado;
import br.ufpr.tads.Rent.controller.EnumClass.marca;
import br.ufpr.tads.Rent.controller.EnumClass.tipo;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author G0006185
 */
public class VeiculoDAO {
    private Connection cn;
    private static final String sqlinsert = "insert into veiculo (marca,categoria,valorCompra,placa,ano,modelo,estado,tipo)values(?,?,?,?,?,?,?,?)";
    private static final String sqlfind = "select * from veiculo where idveiculo = ? or categoria= ?";
    private static final String sqlfindall = "select * from veiculo";
    private static final String sqlfindtipo = "select * from veiculo where tipo=(?) OR marca=(?) OR categoria=(?)";
    private static final String sqlup = "update veiculo set marca =?,categoria=?,valorcompra=?,placa=?,modelo=?,ano=?,estado=? ,tipo=? where idveiculo =?";
    private static final String sqlupestado = "update veiculo set estado=? where idveiculo =?";
    private static final String sqldel = "delete from veiculo where idveiculo=?";
    private static final String sqlvenda = "SELECT placa, marca, modelo, ano, idVeiculo, tipo from veiculo where marca=? and modelo=? and categoria=?";
    
    public VeiculoDAO() throws IOException, FileNotFoundException, ClassNotFoundException, SQLException{
        this.cn =  ConnectionFactory.getConnection(); 
    }
    public void addVeiculo(VeiculoDTO veiculo) throws SQLException{
        PreparedStatement stmt = cn.prepareStatement(sqlinsert);
        stmt.setInt(1, veiculo.getMarca().getKey());
        stmt.setInt(2, veiculo.getCategoria().getKey());
        stmt.setDouble(3, veiculo.getValorCompra());
        stmt.setString(4, veiculo.getPlaca());
        stmt.setInt(5, veiculo.getAno());
        stmt.setInt(6, veiculo.getModelo());
        stmt.setInt(7, veiculo.getEstado());
        stmt.setInt(8, veiculo.getTipo().getKey());
        stmt.executeUpdate();
        stmt.close();
     
    }
    public List<VeiculoDTO> findVeiculo(int id) throws SQLException{
        List<VeiculoDTO> veiculo = new ArrayList();
       ResultSet  rs = null;
       PreparedStatement stmt = cn.prepareStatement(sqlfind);
       stmt.setInt(1, id);
       stmt.setInt(2, id);
       rs = stmt.executeQuery();
       VeiculoDTO veiculo1 = new VeiculoDTO();  
       while(rs.next()){
            veiculo1.setId(rs.getInt("idveiculo"));
            veiculo1.setPlaca(rs.getString("placa"));
            veiculo1.setAno(rs.getInt("ano"));
            veiculo1.setMarca(marca.values()[rs.getInt("marca")]);
            veiculo1.setCategoria(categoria.values()[rs.getInt("categoria")]);
            veiculo1.setValorCompra(rs.getInt("valorcompra"));
            veiculo1.setModelo(rs.getInt("modelo"));
            veiculo1.setEstado(rs.getInt("estado"));
            veiculo1.setTipo(tipo.values()[rs.getInt("tipo")]);
            veiculo.add(veiculo1);
        }
       stmt.close();
       return veiculo;
    }
       public VeiculoDTO findVeiculoid(int id) throws SQLException{
       ResultSet  rs = null;
       PreparedStatement stmt = cn.prepareStatement(sqlfind);
       stmt.setInt(1, id);
       stmt.setInt(2, id);
       rs = stmt.executeQuery();
       VeiculoDTO veiculo = new VeiculoDTO();
       while(rs.next()){
            veiculo.setId(rs.getInt("idveiculo"));
            veiculo.setPlaca(rs.getString("placa"));
            veiculo.setAno(rs.getInt("ano"));
            veiculo.setMarca(marca.values()[rs.getInt("marca")]);
            veiculo.setCategoria(categoria.values()[rs.getInt("categoria")]);
            veiculo.setValorCompra(rs.getInt("valorcompra"));
            veiculo.setModelo(rs.getInt("modelo"));
            veiculo.setEstado(rs.getInt("estado"));
            veiculo.setTipo(tipo.values()[rs.getInt("tipo")]);
        }
       stmt.close();
       return veiculo;
    }
      public List<VeiculoDTO> findVeiculo() throws SQLException{
       
       List<VeiculoDTO> veiculo = new ArrayList();
       ResultSet  rs = null;
       PreparedStatement stmt = cn.prepareStatement(sqlfindall);
       rs = stmt.executeQuery();
       while(rs.next()){
           VeiculoDTO veiculo1 = new VeiculoDTO();
            veiculo1.setId(rs.getInt("idveiculo"));
            veiculo1.setPlaca(rs.getString("placa"));
            veiculo1.setAno(rs.getInt("ano"));
            veiculo1.setMarca(marca.values()[rs.getInt("marca")]);
            veiculo1.setCategoria(categoria.values()[rs.getInt("categoria")]);
            veiculo1.setValorCompra(rs.getInt("valorcompra"));
            veiculo1.setModelo(rs.getInt("modelo"));
            veiculo1.setEstado(rs.getInt("estado"));
            veiculo1.setTipo(tipo.values()[rs.getInt("tipo")]);
        veiculo.add(veiculo1);
       }
       stmt.close();
       return veiculo;
    }
    public void updateVeiculo(VeiculoDTO veiculo) throws SQLException{
        PreparedStatement stmt = cn.prepareStatement(sqlup);
        stmt.setInt(1, veiculo.getMarca().getKey());
        stmt.setInt(2,veiculo.getCategoria().getKey());
        stmt.setDouble(3,veiculo.getValorCompra());
        stmt.setString(4,veiculo.getPlaca());
        stmt.setInt(5,veiculo.getModelo());
        stmt.setInt(6,veiculo.getAno());
        stmt.setInt(7, veiculo.getEstado());
        stmt.setInt(8,veiculo.getTipo().getKey());
        stmt.setInt(9, veiculo.getId());
        stmt.executeUpdate();
        stmt.close();
        
    }
    public void delVeiculo(int id) throws SQLException{
        PreparedStatement stmt = cn.prepareStatement(sqldel);
        stmt.setInt(1, id);
        stmt.executeUpdate();
        stmt.close();
        
    }
    public void devolveVeiculo(int idveiculo) throws SQLException {
          PreparedStatement stmt = cn.prepareStatement(sqlupestado);
          stmt.setInt(1, estado.DISPONIVEL.getKey());
          stmt.setInt(2, idveiculo);
          stmt.executeUpdate();
          stmt.close();
    }
    public void venderVeiculo(int idveiculo) throws SQLException {
          PreparedStatement stmt = cn.prepareStatement(sqlupestado);
          stmt.setInt(1, estado.VENDIDO.getKey());
          stmt.setInt(2, idveiculo);
          stmt.executeUpdate();
          stmt.close();
    }
    public void locarVeiculo(int idveiculo) throws SQLException {
          PreparedStatement stmt = cn.prepareStatement(sqlupestado);
          stmt.setInt(1, estado.LOCADO.getKey());
          stmt.setInt(2, idveiculo);
          stmt.executeUpdate();
          stmt.close();
    }
   public List<VeiculoDTO> findVeiculotipo(int x,int y, int z) throws SQLException{
       ResultSet  rs = null;
       PreparedStatement stmt = cn.prepareStatement(sqlvenda);
       stmt.setInt(1, x);
       stmt.setInt(2, y);
       stmt.setInt(3, z);
       rs = stmt.executeQuery();
       List<VeiculoDTO> lista = new ArrayList();
       while(rs.next()){
            VeiculoDTO veiculo = new VeiculoDTO();
            veiculo.setPlaca(rs.getString("placa"));
            veiculo.setMarca(marca.values()[rs.getInt("marca")]);
            veiculo.setModelo(rs.getInt("modelo"));
            veiculo.setAno(rs.getInt("ano"));
            veiculo.setTipo(tipo.values()[rs.getInt("tipo")]);
            lista.add(veiculo);
        }
       stmt.close();
       return lista;
    }
   
   
   
}
